package com.learning.thread.juc.queue;

import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * ClassName: NoBlockQueue
 * Description: 非阻塞队列 ConcurrentLinkedQueue
 * Date: 2016/11/26 17:45
 *
 * @author SAM SHO
 * @version V1.0
 */
public class NoBlockQueue {

    public static void main(String[] args) {
        test();
    }

    static void test() {

        // 使用 `Compare And Swap`（CAS） 算法实现无锁队列，效率更好
        ConcurrentLinkedQueue<String> noBlockQueue = new ConcurrentLinkedQueue<>();

        /** 添加方法 */
        // add 内部调用 offer 方法
        noBlockQueue.add("a");
        noBlockQueue.offer("b");
        //[a, b]
        System.out.println(noBlockQueue);

        /** 获取数据的方法 */
        // 获取数据，并且从队列移除
        System.out.println(noBlockQueue.poll());
        System.out.println(noBlockQueue);

        // 获取,但是不会从队列移除
        System.out.println(noBlockQueue.peek());
        System.out.println(noBlockQueue);

        // isEmpty 和 size 内部都是调用 first()方法。
        // 因为使用CAS没有加锁,所以是一个不精确的数据
        System.out.println(noBlockQueue.isEmpty());
        System.out.println(noBlockQueue.size());
    }
}

/*
输出：
[a, b]
a
[b]
b
[b]
false
1
*/